/**
 * Représente un mot possiblement affichable a l'écran
 * 
 * @author Marie-Hélène Goddet, Damien Finck, Cédric Schaller
 * 
 */
package fastwriting;

import java.util.Vector;

public class MotProbable implements java.lang.Comparable<MotProbable> {

	private Vector<Lettre> word; // le mot sous forme de liste de lettre
	private String mot; // le mot a afficher (avec accents)
	private boolean erreur; // une erreur par rapport au mot saisi
	private double proba=-1; // la probabilité
	
	/**
	 * Constructeur
	 * @param motDico le mot du dictionnaire a reproduire
	 * @param majuscule mot a afficher en majuscule
	 * @param w le mot saisi a l'ecran
	 * @param erreur l'endroit de l'erreur ou -1 s'il n'y en a pas
	 */
	public MotProbable(MotDico motDico, boolean majuscule, MotSaisi w, int erreur)
	{
		int i=0; //iterateur sur le mot saisi
		int p_mot = 0; // iterateur dans le mot a creer (motDico)
		char lastCar=0; // dernier caractere trouve
		String motSansAccent = motDico.getMotSansAccentMin(); 
		
		this.mot = motDico.toString();
		this.erreur = (erreur!=-1); // il y a une erreur si erreur est different de -1
		
		if (majuscule){ //Cas de la majuscule sur tout le mot
			this.mot = this.mot.toUpperCase();
		}
		
		word = new Vector<Lettre>();
		while (i<w.size() && p_mot<motSansAccent.length())
		{	
			if (p_mot == erreur){ //Lettre fausse a creer
				lastCar = motSansAccent.charAt(p_mot);
				word.add(new Lettre(lastCar));
				p_mot++;
				i--;
			} else {
				if (Character.toLowerCase(w.getCar(i))==motSansAccent.charAt(p_mot)) 
				{
					// Si on a trouve la prochaine lettre du mot
					word.add(w.getLettre(i));
					lastCar = motSansAccent.charAt(p_mot);
					p_mot++;
				} else if (w.getCar(i)==lastCar) {
					//On retombe sur la lettre deja entree
					word.add(w.getLettre(i));
				}
			}
			i++;
		}
		for (;p_mot < motSansAccent.length();p_mot++){
			word.add(new Lettre(motSansAccent.charAt(p_mot)));
		}
	}

	public String toString() {
		return mot;
	}

	/**
	 * Calcule la probabilité du mot
	 * @return la proba calculée
	 */
	public double getProba()
	{
		if (proba==-1){ //Si on ne l'a pas encore calculé
			double somme = 0;
			for (Lettre lettre : word){
				somme +=lettre.getProba();
			}
			if (word.get(word.size()-1).isEndLetter()){
				somme +=word.get(word.size()-1).getProba()*2;
			}
			if (erreur){ 
				somme = somme/2;
			}
			proba = somme;
		}
		return proba;
	}

	/**
	 * Permet de comparer deux mots entre eux en terme de probabilité
	 * @param arg0 le mot à comparer
	 * @return 0 si les nombres sont identiques 
	 * 		   -1 si arg0 est plus grand
	 * 			1 si arg0 est plus petit
	 */
	public int compareTo(MotProbable arg0) {
		double nb1 = arg0.getProba();
		double nb2 = this.getProba();
		if (nb1 > nb2)  return -1; 
	      else if(nb1 == nb2) return 0; 
	      else return 1; 
	}
}
